package com.resource.service;

import java.util.ArrayList;
import java.util.List;

import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PostFilter;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PreFilter;
import org.springframework.stereotype.Service;

@Service
public class HelloService {
	//=========表达式控制方法权限===============
	/**
	 * 注解的约束是，只有当前登录用户名为 javaboy 的用户才可以访问该方法。
	 * @return
	 */
    @PreAuthorize("principal.equals('admin')")
    public String hello() {
        return "hello";
    }
    
    /**
     * 表示访问该方法的用户必须具备 admin 角色。
     * @return
     */
    @PreAuthorize("hasRole('root')")
    public String admin() {
        return "admin";
    }
    
    
    /**
     * 自定义校验服务 @Link CustomService
     * @param user
     * @return
     */
    @PreAuthorize("@customService.check(authentication,#age)")
    public String custom(Integer age) {
        return "custom";
    }
    
    
    
    
    /**
     *	此种方式不够灵活，最好不用
     *	 表示方法该方法的用户必须具备 user 角色，但是注意 user 角色需要加上 ROLE_ 前缀。
     * @return
     */
    @Deprecated
    @Secured({"ROLE_emp"})
    public String user() {
        return "user";
    }
    
    
    /**
     *	 表示访问该方法的 age 参数必须大于 98，否则请求不予通过。
     * @param age
     * @return
     */
    @PreAuthorize("#age>98")
    public String getAge(Integer age) {
        return String.valueOf(age);
    }
    
    
    //=========使用过滤注解===============
    
    /**
     * 	对集合进行过滤，只返回后缀为 2 的元素，filterObject 表示要过滤的元素对象。
     * @return
     */
    @PostFilter("filterObject.lastIndexOf('2')!=-1")
    public List<String> getAllUser() {
        List<String> users = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            users.add("javaboy:" + i);
        }
        return users;
    }
    
    /**
     * 	由于有两个集合，因此使用 filterTarget 指定过滤对象。
     * @param ages
     * @param users
     */
    @PreFilter(filterTarget = "ages",value = "filterObject%2==0")
    public void getAllAge(List<Integer> ages,List<String> users) {
        System.out.println("ages = " + ages);
        System.out.println("users = " + users);
    }
    
    
    
    
    
    
}